/////////////////////////////////////////////////////////////////////////////
/*/	
 *	Creator:		Joshua C. Rouzer
 *	Title:			
 *	Last Edited:	06/17/2013
 *	Summary:		
/*/
/////////////////////////////////////////////////////////////////////////////
#include "MessageSystem.h"
#include <iostream>
/////////////////////////////////////////////////////////////////////////////
// Function		: CMessageSystem
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
CMessageSystem::CMessageSystem(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// Function		: ~CMessageSystem
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
CMessageSystem::~CMessageSystem(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// Function		: GetInstance
// Return		: CMessageSystem*
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
CMessageSystem* CMessageSystem::GetInstance()
{
	static CMessageSystem instance;
	return &instance;
}
/////////////////////////////////////////////////////////////////////////////
// Function		: InitMessageSystem
// Parameters	: proc - the message proc function pointer to assign
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
void CMessageSystem::InitMessageSystem(MESSAGEPROC proc)
{
		if (proc == NULL)	
			return;

		m_FnMsgProc = proc;
}
/////////////////////////////////////////////////////////////////////////////
// Function		: SendMessage
// Parameters	: Msg - the message to send to the queue
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
void CMessageSystem::SendNewMessage(CMessage* Msg)
{
	if (Msg != nullptr)
		m_MsgQueue.push(Msg);
}
/////////////////////////////////////////////////////////////////////////////
// Function		: ProcessMessages
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
void CMessageSystem::ProcessMessages()
{
	if (m_FnMsgProc != nullptr)
	{
		while(!m_MsgQueue.empty())
		{
			m_FnMsgProc(m_MsgQueue.front());	
			delete m_MsgQueue.front();			
			m_MsgQueue.pop();					
		}
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: ClearMessages
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
void CMessageSystem::ClearMessages()
{
	for (unsigned int i = 0; i < m_MsgQueue.size(); i++)
	{
		delete m_MsgQueue.front();
		m_MsgQueue.pop();
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Shutdown
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
void CMessageSystem::Shutdown()
{
	m_FnMsgProc = NULL;
	ClearMessages();
}
/////////////////////////////////////////////////////////////////////////////
// Function		: GetNumMessages
// Return		: int
// Notes		: 
/////////////////////////////////////////////////////////////////////////////
int CMessageSystem::GetNumMessages()
{
	return m_MsgQueue.size();
}
